package com.jiashihui.server1.model;

import com.jiashihui.server1.annotation.Min;
import com.jiashihui.server1.annotation.Money;
import com.jiashihui.server1.model.validated.First;
import com.jiashihui.server1.model.validated.Insert;
import com.jiashihui.server1.model.validated.Second;

import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
import java.util.List;

/**
 * describe: 测试项目
 *
 * @author jiashihui
 * @date 2018 /11/20
 */
public class User {

    /**
     * 组验证补充:
     * 第一是：不分配groups分组时，默认每次都需要验证。（注意：添加分组，只校验分组对应的属性。）
     * 第二是：通过groups分组可以对同一个变量进行多个验证，如name属性。
     * 第三是：默认的情况下，不同的分组约束验证是无序的，
     *          但是在有些情况下验证的相互约束很重要（比如前一个组验证失败，后面的将不再验证等情况），所以groups分组的验证也有前后验证顺序。
     *          使用@GroupSequence注解进行排序。
     */
    /**
     * @Null	限制只能为null
     * @NotNull	限制必须不为null
     * @AssertFalse	限制必须为false
     * @AssertTrue	限制必须为true
     * @DecimalMax(value)	限制必须为一个不大于指定值的数字
     * @DecimalMin(value)	限制必须为一个不小于指定值的数字
     * @Digits(integer,fraction)	限制必须为一个小数，且整数部分的位数不能超过integer，小数部分的位数不能超过fraction
     * @Future	限制必须是一个将来的日期
     * @Max(value)	限制必须为一个不大于指定值的数字
     * @Min(value)	限制必须为一个不小于指定值的数字
     * @Past	限制必须是一个过去的日期
     * @Pattern(value)	限制必须符合指定的正则表达式
     * @Size(max,min)	限制字符长度必须在min到max之间
     * @Past	验证注解的元素值（日期类型）比当前时间早
     * @NotEmpty	验证注解的元素值不为null且不为空（字符串长度不为0、集合大小不为0）
     * @NotBlank	验证注解的元素值不为空（不为null、去除首位空格后长度为0），不同于@NotEmpty，@NotBlank只应用于字符串且在比较时会去除字符串的空格
     * @Email	验证注解的元素值是Email，也可以通过正则表达式和flag指定自定义的email格式
     */

    @NotEmpty(groups={Insert.class})
    private String id;

    @Min(value=8, message="年龄不能小于8岁")
    private int age;

    @Money(message="标准的金额形式为xxx.xx")
    private Double salary;

    //对用户名进行两次不同情况的验证。
    @NotEmpty(groups={First.class})
    @Size(min=5,max=10,groups={Second.class})
    @Pattern(regexp="^[a-zA-Z0-9]+$",message="{account.username.space}")
    private String name;

    @Valid // 嵌套验证必须用@Valid
    @NotNull(message = "cars不能为空")
    @Size(min = 1, message = "cars至少要有一个自定义属性")
    private List<Car> cars;

    /**
     * Gets cars.
     *
     * @return the cars
     */
    public List<Car> getCars() {
        return cars;
    }

    /**
     * Sets cars.
     *
     * @param cars the cars
     */
    public void setCars(List<Car> cars) {
        this.cars = cars;
    }

    /**
     * Gets id.
     *
     * @return the id
     */
    public String getId() {
        return id;
    }

    /**
     * Sets id.
     *
     * @param id the id
     */
    public void setId(String id) {
        this.id = id;
    }

    /**
     * Gets age.
     *
     * @return the age
     */
    public int getAge() {
        return age;
    }

    /**
     * Sets age.
     *
     * @param age the age
     */
    public void setAge(int age) {
        this.age = age;
    }

    /**
     * Gets salary.
     *
     * @return the salary
     */
    public Double getSalary() {
        return salary;
    }

    /**
     * Sets salary.
     *
     * @param salary the salary
     */
    public void setSalary(Double salary) {
        this.salary = salary;
    }

    /**
     * Gets name.
     *
     * @return the name
     */
    public String getName() {
        return name;
    }

    /**
     * Sets name.
     *
     * @param name the name
     */
    public void setName(String name) {
        this.name = name;
    }
}
